﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using AMVInfoSpace;
using System.IO;

namespace AMVCommander
{
    public partial class FormUpdateRating : Form
    {
        /// <summary>Лист AMV для обновления рейтинга</summary>
        List<AMV> AmvL = new List<AMV>();
        List<bool> IsUpdate = new List<bool>();

        public string fPathLog = "";
        Grab grabAMVNews = null;
        Grab grabCreaCon = null;

        public FormUpdateRating()
        {
            InitializeComponent();
        }

        public void ShowDialog(out string FPathLog)
        {
            //if (Gl.infoL.Count == 0) Gl.LoadAmvInfoList();
            ShowDialog();
            FPathLog = fPathLog;
        }

        private void FormUpdateRating_Shown(object sender, EventArgs e)
        {
            List<int> indListAMVNews = new List<int>();
            List<int> indListCreaCon = new List<int>();

            // формирование списка привязаных AMV к AMVNews и CreaCons (Akross не участвует, так как для получения рейтинга необходима регистрация)
            for (int i = 0; i < Gl.DB.Count; i++)
            {
                if (Gl.DB[i].AMVNewsNum != -1 && !indListAMVNews.Contains(Gl.DB[i].AMVNewsNum))
                {
                    indListAMVNews.Add(Gl.DB[i].AMVNewsNum);
                    AmvL.Add(Gl.DB[i]);
                }
                // добавлять только если не добавлено для обновления с AMVNews
                else if (Gl.DB[i].CreaConNum != -1 && !indListCreaCon.Contains(Gl.DB[i].CreaConNum))
                {
                    indListCreaCon.Add(Gl.DB[i].CreaConNum);
                    AmvL.Add(Gl.DB[i]);
                }

            }
            grabAMVNews = new Grab(SITE.AMVNews, indListAMVNews, false);
            grabCreaCon = new Grab(SITE.CreaCon, indListCreaCon, false);

            prgBar.Value = 0;
            prgBar.Maximum = indListAMVNews.Count + indListCreaCon.Count;

            grabAMVNews.StartGrab();
            grabCreaCon.StartGrab();
            tmrMain.Start();
        }

        private void tmrMain_Tick(object sender, EventArgs e)
        {
            tmrMain.Stop();
            if (grabAMVNews.Done && grabCreaCon.Done)
            {
                GrabDone();
                return;
            }
            prgBar.Value = grabAMVNews.DoneCount + grabCreaCon.DoneCount;
            tmrMain.Start();
        }

        void GrabDone()
        {
            DateTime dtUpdate = DateTime.Now;
            List<GrabInfo> grAMVNews = grabAMVNews.GetGrabResult();
            List<GrabInfo> grCreaCon = grabCreaCon.GetGrabResult();

            List<AMV> updated = new List<AMV>();
            List<AMV> diffRating = new List<AMV>();
            List<decimal> lastRating = new List<decimal>();
            List<GrabInfo> notCorrect = new List<GrabInfo>();
            List<GrabInfo> notParse = new List<GrabInfo>();
            List<GrabInfo> notLoad = new List<GrabInfo>();
            List<GrabInfo> notAmvInfo = new List<GrabInfo>();

            #region *** обновление для AMVNews ***********************
            foreach (GrabInfo gr in grAMVNews)
            {
                if (gr.IsGrabError)
                {
                    if (gr.LoadEx != null) notLoad.Add(gr);
                    if (gr.ParseEx != null) notParse.Add(gr);
                    continue;
                }
                if (!gr.PageIsCorrect)
                {
                    notCorrect.Add(gr);
                    continue;
                }
                if (gr.AmvInfo != null)
                {
                    foreach (AMV amv in AmvL)
                    {
                        if (amv.AMVNewsNum == gr.AmvID && !updated.Contains(amv))
                        {
                            if (amv.Sites[SITE.AMVNews].Rating != gr.AmvInfo.Rating)
                            {
                                diffRating.Add(amv);
                                lastRating.Add(amv.MiddleRating);
                                amv.Sites[SITE.AMVNews].Rating = gr.AmvInfo.Rating;

                            }
                            amv.Sites[SITE.AMVNews].LastUpdateRating = dtUpdate;
                            updated.Add(amv);
                        }
                    }

                    continue;
                }
                notAmvInfo.Add(gr);
            }
            #endregion *** обновление для AMVNews ***********************

            #region *** обновление для CreaCon ***********************
            foreach (GrabInfo gr in grCreaCon)
            {
                if (gr.IsGrabError)
                {
                    if (gr.LoadEx != null) notLoad.Add(gr);
                    if (gr.ParseEx != null) notParse.Add(gr);
                    continue;
                }
                if (!gr.PageIsCorrect)
                {
                    notCorrect.Add(gr);
                    continue;
                }
                if (gr.AmvInfo != null)
                {
                    foreach (AMV amv in AmvL)
                    {
                        if (amv.CreaConNum == gr.AmvID && !updated.Contains(amv))
                        {
                            if (amv.Sites[SITE.CreaCon].Rating != gr.AmvInfo.Rating)
                            {
                                diffRating.Add(amv);
                                lastRating.Add(amv.MiddleRating);
                                amv.Sites[SITE.CreaCon].Rating = gr.AmvInfo.Rating;
                            }
                            amv.Sites[SITE.CreaCon].LastUpdateRating = dtUpdate;
                            updated.Add(amv);
                        }
                    }

                    continue;
                }
                notAmvInfo.Add(gr);
            }
            #endregion *** обновление для CreaCon ***********************

            #region *** Построение лога **************************************
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("Всего выбрано для обновления: " + AmvL.Count.ToString());
            sb.AppendLine("Получен рейтинг для обновления у: " + updated.Count.ToString());
            sb.AppendLine("Из них изменены рейтинги у: " + diffRating.Count.ToString());
            sb.AppendLine("Не удалось получить рейтинг для: " + (AmvL.Count - updated.Count).ToString());
            sb.AppendLine("-------------------");
            sb.AppendLine("Список AMV с обновленными рейтингами:");
            for (int i = 0; i < diffRating.Count; i++)
                sb.AppendLine(string.Format("\t{0} ->{1} AMV: {2}", lastRating[i], diffRating[i].MiddleRating, diffRating[i].Name));
            sb.AppendLine("-------------------");
            sb.AppendLine("Информация по ошибкам загрузки страниц");
            sb.AppendLine("\tНекорректные страницы:");
            foreach (GrabInfo gr in notCorrect)
                sb.AppendLine(string.Format("\t\tID: {0} Сайт:{1}", gr.AmvID.ToString("00000"), gr.Site.ToString()));
            sb.AppendLine("\tНе удалось распарсить:");
            foreach (GrabInfo gr in notParse)
                sb.AppendLine(string.Format("t\tID: {0} Сайт:{1} Ошибка: {2}", gr.AmvID.ToString("00000"), gr.Site.ToString(), gr.ParseEx.Message));
            sb.AppendLine("\tНе удалось загрузить:");
            foreach (GrabInfo gr in notLoad)
                sb.AppendLine(string.Format("t\tID: {0} Сайт:{1} Ошибка: {2}", gr.AmvID.ToString("00000"), gr.Site.ToString(), gr.LoadEx.Message));

            fPathLog = Gl.dPathLogs + "\\UpdateRatings_" + DateTime.Now.ToString("dd_MM_yy_HH_mm_ss") + ".log";
            File.WriteAllText(fPathLog, sb.ToString(), Encoding.UTF8);
            #endregion *** Построение лога **************************************

            Close();
        }

    }
}
